home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / disk / cdrom / MusicBox-2.1os.lha / MusicBox / MusicBoxLibrary.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-29  |  23.2 KB  |  919 lines

  1. /*
  2.  ##########################################################################
  3.  ####                                                                  ####
  4.  ####                        The MusicBox Project                      ####
  5.  ####                    ============================                  ####
  6.  ####                                                                  ####
  7.  #### MusicBoxLibrary.c                                                ####
  8.  ####                                                                  ####
  9.  #### Version 2.1os  --  September 29, 2000                            ####
  10.  ####                                                                  ####
  11.  #### Copyright (C) 1994  Thomas Dreibholz                             ####
  12.  ####               2000  Molbachweg 7                                 ####
  13.  ####                     51674 Wiehl                                  ####
  14.  ####                     Germany                                      ####
  15.  ####                                                                  ####
  16.  ####                     EMail: Dreibholz@bigfoot.com                 ####
  17.  ####                     WWW:   http://www.bigfoot.com/~dreibholz     ####
  18.  ####                                                                  ####
  19.  ##########################################################################
  20. */
  21. /***************************************************************************
  22.  *                                                                         *
  23.  *   This program is free software; you can redistribute it and/or modify  *
  24.  *   it under the terms of the GNU General Public License as published by  *
  25.  *   the Free Software Foundation; either version 2 of the License, or     *
  26.  *   (at your option) any later version.                                   *
  27.  *                                                                         *
  28.  ***************************************************************************/
  29.  
  30. /* MusicBox-Library Funktionen */
  31.  
  32. #define MBL_VERSION 210
  33.  
  34. #include "MusicBoxLibrary.h"
  35. #include "MusicBox.h"
  36. #include <exec/execbase.h>
  37.  
  38. UBYTE *MusicBoxHost=MUSICBOX_HOSTNAME;
  39. UBYTE *ArchiveHost=ARCHIVE_HOSTNAME;
  40.  
  41. UBYTE *GetLStr();
  42. int    OffsetX();
  43. int    OffsetY();
  44. void   PutMText();
  45. void   ErrorL();
  46.  
  47. extern struct Catalog  *Catalog;
  48. extern struct ExecBase *SysBase;
  49. extern struct Library  *VersionBase;
  50. extern ULONG            SleepPointerSize;
  51. extern UBYTE           *SleepPointerData;
  52. UBYTE                  *ChipData;
  53.  
  54. struct TextAttr Times15 =
  55. {
  56.  "times.font", 15,
  57.  FS_NORMAL,FPF_DISKFONT
  58. };
  59.  
  60. struct TextAttr Topaz9 =
  61. {
  62.  "topaz.font", 9,
  63.  FS_NORMAL,FPF_ROMFONT
  64. };
  65.  
  66. struct TextAttr Helvetica13 =
  67. {
  68.  "helvetica.font", 13,
  69.  FS_NORMAL,FPF_DISKFONT
  70. };
  71.  
  72. struct MusicBoxCommand *AddUser(name)
  73.  UBYTE *name;
  74. {
  75.  register struct MusicBoxUser *mbc;
  76.  
  77.  mbc=AllocMem(sizeof(struct MusicBoxCommand),MEMF_CLEAR|MEMF_PUBLIC);
  78.  if(mbc!=NULL)
  79.   {
  80.    mbc->HostName=name;
  81.    mbc->ReplyPort=CreatePort(0L,0L);
  82.    if(mbc->ReplyPort==NULL)
  83.     {
  84.      FreeMem(mbc,sizeof(struct MusicBoxCommand));
  85.      return(NULL);
  86.     }
  87.    mbc->SignalMask=(1L<<mbc->ReplyPort->mp_SigBit);
  88.    mbc->Message.mn_Length=sizeof(struct MusicBoxCommand);
  89.   }
  90.  return(mbc);
  91. }
  92.  
  93. void RemUser(mbc)
  94.  struct MusicBoxCommand *mbc;
  95. {
  96.  DeletePort(mbc->ReplyPort);
  97.  FreeMem(mbc,sizeof(struct MusicBoxCommand));
  98. }
  99.  
  100. BOOL PutCommand(mbc)
  101.  struct MusicBoxCommand *mbc;
  102. {
  103.  REGISTER BOOL            result;
  104.  register struct MsgPort *port;
  105.  
  106.  Forbid();
  107.  port=FindPort(mbc->HostName);
  108.  if(port!=NULL)
  109.   {
  110.    mbc->Message.mn_Node.ln_Succ=NULL;
  111.    mbc->Message.mn_Node.ln_Pred=NULL;
  112.    mbc->Message.mn_Node.ln_Type=NT_MESSAGE;
  113.    mbc->Message.mn_ReplyPort=mbc->ReplyPort;
  114.    PutMsg(port,mbc);
  115.    result=TRUE;
  116.   }
  117.  else
  118.    result=FALSE;
  119.  Permit();
  120.  return(result);
  121. }
  122.  
  123. struct MusicBoxCommand *CheckResult(mbc)
  124.  struct MusicBoxCommand *mbc;
  125. {
  126.  return(GetMsg(mbc->ReplyPort));
  127. }
  128.  
  129. int WaitResult(mbc)
  130.  struct MusicBoxCommand *mbc;
  131. {
  132.  WaitPort(mbc->ReplyPort);
  133.  GetMsg(mbc->ReplyPort);
  134.  return(mbc->Status);
  135. }
  136.  
  137. int MusicBoxCommand(mbc,cmd)
  138.  struct MusicBoxCommand *mbc;
  139.  LONG                    cmd;
  140. {
  141.  mbc->Command=cmd;
  142.  if((PutCommand(mbc))==TRUE)
  143.    return(WaitResult(mbc));
  144.  return(MBCS_NO_PORT);
  145. }
  146.  
  147. int MusicBoxCommand1(mbc,cmd,a1)
  148.  struct MusicBoxCommand *mbc;
  149.  LONG                    cmd,a1;
  150. {
  151.  mbc->Command=cmd;
  152.  mbc->Args[0]=a1;
  153.  if((PutCommand(mbc))==TRUE)
  154.    return(WaitResult(mbc));
  155.  return(MBCS_NO_PORT);
  156. }
  157.  
  158. int MusicBoxCommand2(mbc,cmd,a1,a2)
  159.  struct MusicBoxCommand *mbc;
  160.  LONG                    cmd,a1,a2;
  161. {
  162.  mbc->Command=cmd;
  163.  mbc->Args[0]=a1;
  164.  mbc->Args[1]=a2;
  165.  if((PutCommand(mbc))==TRUE)
  166.    return(WaitResult(mbc));
  167.  return(MBCS_NO_PORT);
  168. }
  169.  
  170. void Out(win,x,y,text)
  171.  struct Window   *win;
  172.  int              x,y;
  173.  UBYTE           *text;
  174. {
  175.  PutMText(win,x,y,text,435-x);
  176. }
  177.  
  178. void OutR(win,x,y,text)
  179.  struct Window   *win;
  180.  int              x,y;
  181.  UBYTE           *text;
  182. {
  183.  REGISTER UWORD l;
  184.  
  185.  l=strlen(text);
  186.  Move(win->RPort,x+OffsetX(win)-TextLength(win->RPort,text,l),y+OffsetY(win));
  187.  Text(win->RPort,text,l);
  188. }
  189.  
  190. void OutC(win,x,y,w,text)
  191.  struct Window   *win;
  192.  int              x,y,w;
  193.  UBYTE           *text;
  194. {
  195.  REGISTER UWORD l;
  196.  
  197.  l=strlen(text);
  198.  Move(win->RPort,x+OffsetX(win)+((w-TextLength(win->RPort,text,l))/2),y+OffsetY(win));
  199.  Text(win->RPort,text,l);
  200. }
  201.  
  202. void InformationA(info)
  203.  struct InfoStruct *info;
  204. {
  205.  UBYTE                         t1[30];
  206.  UBYTE                         pro[10],copro[10],cache[20];
  207.  APTR                          VisualInfo;
  208.  REGISTER ULONG                chip,fast,total,vmem;
  209.  register struct IntuiMessage *msg;
  210.  register struct Window       *win;
  211.  register struct RastPort     *rp;
  212.  register struct TextFont     *Font;
  213.  register struct Image        *image;
  214.  struct TagItem                tag[9];
  215.  struct Screen                *scr;
  216.  int                           i,ox,oy;
  217.  
  218.  if(info->LowRes==TRUE)
  219.   {
  220.    Font=OpenDiskFont(&Helvetica13);
  221.    if(Font==NULL)
  222.     {
  223.      ErrorL(83,"Unable to open font: helvetica.font 13");
  224.      return;
  225.     }
  226.   }
  227.  else
  228.   {
  229.    Font=OpenDiskFont(&Times15);
  230.    if(Font==NULL)
  231.     {
  232.      ErrorL(25,"Unable to open font: times.font 15");
  233.      return;
  234.     }
  235.   }
  236.  if(SysBase->AttnFlags & AFF_68030) strcpy(&pro,"68030");
  237.  else if(SysBase->AttnFlags & AFF_68020) strcpy(&pro,"68020");
  238.  else if(SysBase->AttnFlags & AFF_68010) strcpy(&pro,"68010");
  239.  else strcpy(&pro,"68000");
  240.  if(SysBase->AttnFlags & AFF_68882) strcpy(&copro,"68882");
  241.  else if(SysBase->AttnFlags & AFF_68881) strcpy(&copro,"68881");
  242.  else strcpy(&copro,GetLStr(64,"N/A"));
  243.  tag[0].ti_Tag=WA_Left;
  244.  tag[0].ti_Data=90;
  245.  tag[1].ti_Tag=WA_Top;
  246.  tag[1].ti_Data=60;
  247.  tag[2].ti_Tag=WA_InnerWidth;
  248.  tag[2].ti_Data=455;
  249.  tag[3].ti_Tag=WA_InnerHeight;
  250.  tag[3].ti_Data=140;
  251.  tag[4].ti_Tag=WA_IDCMP;
  252.  tag[4].ti_Data=CLOSEWINDOW;
  253.  tag[5].ti_Tag= WA_Flags;
  254.  tag[5].ti_Data=WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|ACTIVATE;
  255.  tag[6].ti_Tag=WA_Title;
  256.  tag[6].ti_Data=info->Title;
  257.  tag[7].ti_Tag=TAG_DONE;
  258.  win=OpenWindowTagList(NULL,&tag);
  259.  if(win!=NULL)
  260.   {
  261.    rp=win->RPort;
  262.    ox=OffsetX(win);
  263.    oy=OffsetY(win);
  264.    if(Font) SetFont(rp,Font);
  265.    SetAPen(rp,2);
  266.    OutC(win,95,0,170,info->ProgName);
  267.    OutC(win,95,15,170,"Copyright (C) 1994-2000 by");
  268.    OutC(win,95,30,170,"Thomas Dreibholz");
  269.    OutC(win,95,45,170,"All rights reserved");
  270.  
  271.    if(info->Icon!=NULL)
  272.     {
  273.      scr=LockPubScreen(NULL);
  274.      if(scr!=NULL)
  275.       {
  276.        VisualInfo=GetVisualInfoA(scr,NULL);
  277.        if(VisualInfo!=NULL)
  278.         {
  279.          tag[0].ti_Tag  = GT_VisualInfo;
  280.          tag[0].ti_Data = VisualInfo;
  281.          tag[1].ti_Tag  = TAG_DONE;
  282.          image=info->Icon->do_Gadget.GadgetRender;
  283.          DrawBevelBoxA(rp,9+ox,oy-1,image->Width+2,image->Height+2,&tag);
  284.          DrawImage(rp,image,10+ox,oy);
  285.          image=info->Icon->do_Gadget.SelectRender;
  286.          if(image!=NULL)
  287.           {
  288.            tag[1].ti_Tag  = GTBB_Recessed;
  289.            tag[1].ti_Data = TRUE;
  290.            tag[2].ti_Tag  = TAG_DONE;
  291.            DrawBevelBoxA(rp,9+ox,79+oy,image->Width+2,image->Height+2,&tag);
  292.            DrawImage(rp,image,10+ox,80+oy);
  293.           }
  294.          FreeVisualInfo(VisualInfo);
  295.         }
  296.        UnlockPubScreen(NULL,scr);
  297.       }
  298.     }
  299.  
  300.    for(i=0;i<10;i++)
  301.     {
  302.      if(info->Text[i].LeftEdge==0)
  303.        i=10;
  304.      else
  305.       {
  306.        if(info->Text[i].Flags==ISTF_LEFT)
  307.          Out(win,info->Text[i].LeftEdge,info->Text[i].TopEdge,info->Text[i].Text);
  308.        else if(info->Text[i].Flags==ISTF_RIGHT)
  309.          OutR(win,info->Text[i].LeftEdge,info->Text[i].TopEdge,info->Text[i].Text);
  310.       }
  311.     }
  312.  
  313.    if(info->RegInfo == NULL)
  314.      OutC(win,0,65,455,"This program is Open Source - Read COPYING!");
  315.    else
  316.      OutC(win,0,65,455,info->RegInfo);
  317.  
  318.    i=0;
  319.    do
  320.     {
  321.      if(i<40)
  322.       {
  323.        if(i==0)
  324.         {
  325.          SetAPen(rp,0);
  326.          RectFill(rp,ox+300,oy-10,ox+435,oy+50);
  327.          SetAPen(rp,2);
  328.         }
  329.        Out(win,300,0,GetLStr(21,"Chip:"));
  330.        Out(win,300,15,GetLStr(22,"Fast:"));
  331.        Out(win,300,30,GetLStr(23,"VMem:"));
  332.        Out(win,300,45,GetLStr(24,"Total:"));
  333.        chip=AvailMem(MEMF_CHIP);
  334.        fast=AvailMem(MEMF_FAST|MEMF_PUBLIC);
  335.        total=AvailMem(MEMF_ANY);
  336.        vmem=total-AvailMem(MEMF_PUBLIC);
  337.        sprintf(&t1,"%6ld KB",chip/1024L);
  338.        OutR(win,430,0,&t1);
  339.        sprintf(&t1,"%6ld KB",fast/1024L);
  340.        OutR(win,430,15,&t1);
  341.        sprintf(&t1,"%6ld KB",vmem/1024L);
  342.        OutR(win,430,30,&t1);
  343.        sprintf(&t1,"%6ld KB",total/1024L);
  344.        OutR(win,430,45,&t1);
  345.       }
  346.      else if(i<52)
  347.       {
  348.        if(i==40)
  349.         {
  350.          SetAPen(rp,0);
  351.          RectFill(rp,ox+300,oy-10,ox+435,oy+50);
  352.          SetAPen(rp,2);
  353.          Out(win,300,0,GetLStr(65,"Processor:"));
  354.          Out(win,300,15,GetLStr(66,"Coprocessor:"));
  355.          Out(win,300,30,GetLStr(67,"Inst. cache:"));
  356.          Out(win,300,45,GetLStr(68,"Data cache:"));
  357.          OutR(win,430,0,&pro);
  358.          OutR(win,430,15,&copro);
  359.          chip=CacheControl(0,0);
  360.          strcpy(&t1,GetLStr(69,"Off"));
  361.          if(chip & CACRF_EnableD)
  362.           {
  363.            strcpy(&t1,GetLStr(70,"On"));
  364.            if(chip & CACRF_DBE) strcpy(&t1,GetLStr(71,"Burst"));
  365.           }
  366.          OutR(win,430,30,&t1);
  367.          chip=CacheControl(0,0);
  368.          strcpy(&t1,GetLStr(69,"Off"));
  369.          if(chip & CACRF_EnableI)
  370.           {
  371.            strcpy(&t1,GetLStr(70,"On"));
  372.            if(chip & CACRF_IBE) strcpy(&t1,GetLStr(71,"Burst"));
  373.           }
  374.          OutR(win,430,45,&t1);
  375.         }
  376.       }
  377.      if(i<62)
  378.       {
  379.        if(i==52)
  380.         {
  381.          SetAPen(rp,0);
  382.          RectFill(rp,ox+300,oy-10,ox+435,oy+50);
  383.          SetAPen(rp,2);
  384.          Out(win,300,15,GetLStr(72,"Kickstart:"));
  385.          Out(win,300,30,GetLStr(73,"Workbench:"));
  386.          sprintf(&t1,"%ld.%ld",SysBase->LibNode.lib_Version,
  387.                                SysBase->LibNode.lib_Revision);
  388.          OutR(win,430,15,&t1);
  389.          if(VersionBase==NULL)
  390.            strcpy(&t1,"??.??");
  391.          else
  392.            sprintf(&t1,"%ld.%ld",VersionBase->lib_Version,
  393.                                  VersionBase->lib_Revision);
  394.          OutR(win,430,30,&t1);
  395.         }
  396.       }
  397.      else
  398.        i=-1;
  399.  
  400.      Delay(12); i++;
  401.      msg=GetMsg(win->UserPort);
  402.     } while(msg==NULL);
  403.    ReplyMsg(msg);
  404.    CloseWindow(win);
  405.   }
  406.  CloseFont(Font);
  407. }
  408.  
  409. LONG MultiRequestA(titel,text,gads)
  410.  UBYTE *titel,*text,*gads;
  411. {
  412.  struct EasyStruct easy;
  413.  
  414.  easy.es_StructSize=sizeof(struct EasyStruct);
  415.  easy.es_Flags=0;
  416.  easy.es_Title=titel;
  417.  easy.es_TextFormat=text;
  418.  easy.es_GadgetFormat=gads;
  419.  return(EasyRequestArgs(NULL,&easy,0L,0L));
  420. }
  421.  
  422. void ErrorL(num,text)
  423.  int    num;
  424.  UBYTE *text;
  425. {
  426.  MultiRequestA(GetLStr(15,"Music Box - Error!"),GetLStr(num,text),GetLStr(16,"Abort"));
  427. }
  428.  
  429. int EasyCommand(host,cmd,a1,a2)
  430.  UBYTE *host;
  431.  long   cmd,a1,a2;
  432. {
  433.  struct MusicBoxCommand *mbc;
  434.  int                     result;
  435.  
  436.  mbc=AddUser(host);
  437.  if(mbc!=NULL)
  438.   {
  439.    result=MusicBoxCommand2(mbc,cmd,a1,a2);
  440.    RemUser(mbc);
  441.   }
  442.  else
  443.    return(MBCS_NO_MEMORY);
  444.  return(result);
  445. }
  446.  
  447. int IconifyMusicBox() { return(EasyCommand(MUSICBOX_HOSTNAME,MBC_ICONIFY,0,0)); }
  448. int UnIconifyMusicBox() { return(EasyCommand(MUSICBOX_HOSTNAME,MBC_UNICONIFY,0,0)); }
  449. int IconifyArchive() { return(EasyCommand(ARCHIVE_HOSTNAME,MBC_ICONIFY,0,0)); }
  450. int UnIconifyArchive() { return(EasyCommand(ARCHIVE_HOSTNAME,MBC_UNICONIFY,0,0)); }
  451.  
  452. void OpenArchive(id,title,flags)
  453.  ULONG id;
  454.  int   title;
  455.  UBYTE flags;
  456. {
  457.  UBYTE                       text[100];
  458.  struct TagItem              tag[5];
  459.  register struct FileHandle *con;
  460.  register int                test;
  461.  
  462.  if(!(flags & OA_QUIET))
  463.   {
  464.    test=EasyCommand(ARCHIVE_HOSTNAME,7000,id,title);
  465.    if(test==0) return;
  466.   }
  467.  else
  468.   {
  469.    test=EasyCommand(ARCHIVE_HOSTNAME,MBC_VERSION,0,0);
  470.    if(test==MBCS_OK) return;
  471.   }
  472.  con=Open("CON:10/20/620/150/Music Box/AUTO/WAIT/CLOSE",MODE_NEWFILE);
  473.  if(con!=NULL)
  474.   {
  475.    tag[0].ti_Tag=SYS_Input;
  476.    tag[0].ti_Data=NULL;
  477.    tag[1].ti_Tag=SYS_Output;
  478.    tag[1].ti_Data=con;
  479.    tag[2].ti_Tag=SYS_Asynch;
  480.    tag[2].ti_Data=TRUE;
  481.    tag[3].ti_Tag=SYS_UserShell;
  482.    tag[3].ti_Data=TRUE;
  483.    tag[4].ti_Tag=TAG_DONE;
  484.    sprintf(&text,"MusicBox:Archive DISCID %lx TITLE %ld",
  485.                  id,title);
  486.    if(flags & OA_QUIET)
  487.      strcat(&text," QUIET");
  488.    if(flags & OA_LOWRES)
  489.      strcat(&text," LOWRES");
  490.    SystemTagList(&text,&tag);
  491.   }
  492.  else
  493.    ErrorL(20,"Unable to open AutoCon-window!");
  494. }
  495.  
  496. UBYTE *GetLStr(num,def)
  497.  LONG   num;
  498.  UBYTE *def;
  499. {
  500.  if(Catalog==NULL) return(def);
  501.  return(GetCatalogStr(Catalog,num,def));
  502. }
  503.  
  504. struct NewGadget n1={10,5,580,170,0L,0L,0,0,0,0L};
  505. struct NewGadget n2={10,178,580,18,0L,0L,10,PLACETEXT_IN,0,0L};
  506.  
  507. UBYTE *d1="%02d  %02d:%02d'%02d:   %2d:%02d'%02d  %3ld.%ld MB   %s";
  508. UBYTE *d2="%02d %02d:%02d'%02d:  %2d:%02d'%02d %3ld.%ld MB  %s";
  509.  
  510. void DisplayCatalog(cat,lowres)
  511.  struct Katalog *cat;
  512.  BOOL            lowres;
  513. {
  514.  REGISTER BOOL                 ende;
  515.  UBYTE                        *tex;
  516.  struct TagItem                tag[10];
  517.  struct List                   Liste;
  518.  register struct XNode
  519.   { struct Node Node;
  520.     UBYTE       String[100]; } *node,*n[5];
  521.  struct Remember              *Remember;
  522.  struct Screen                *scr;
  523.  struct Gadget                *GadgetList,*g1,*g2;
  524.  struct TextFont              *Font;
  525.  struct TextAttr              *attr;
  526.  register int                  i;
  527.  register long                 j;
  528.  register struct Gadget       *gad;
  529.  register struct Window       *win;
  530.  register struct RastPort     *rp;
  531.  register struct IntuiMessage *msg;
  532.  register struct VisualInfo   *vi;
  533.  
  534.  NewList(&Liste);
  535.  j=0;
  536.  if(lowres==FALSE) tex=d1; else tex=d2;
  537.  for(i=0;i<cat->Anzahl;i++)
  538.   {
  539.    node=AllocRemember(&Remember,sizeof(struct XNode),MEMF_CLEAR|MEMF_ANY);
  540.    if(node==NULL)
  541.     {
  542.      FreeRemember(&Remember,TRUE);
  543.      ErrorL(6,"Not enough memory!");
  544.      return;
  545.     }
  546.    node->Node.ln_Name=&node->String;
  547.    sprintf(&node->String,
  548.            tex,
  549.            i+1,
  550.            cat->KE[i].SAdresse/75/60,(cat->KE[i].SAdresse/75) % 60,cat->KE[i].SAdresse % 75,
  551.            cat->KE[i].TAdresse/75/60,(cat->KE[i].TAdresse/75) % 60,cat->KE[i].TAdresse % 75,
  552.            cat->KE[i].TAdresse/512,(cat->KE[i].TAdresse % 512)/52,
  553.            &cat->KE[i].Titel);
  554.    j+=cat->KE[i].TAdresse;
  555.    AddTail(&Liste,node);
  556.   }
  557.  for(i=0;i<5;i++)
  558.   {
  559.    n[i]=AllocRemember(&Remember,sizeof(struct XNode),MEMF_CLEAR|MEMF_ANY);
  560.    if(n[i]==NULL)
  561.     {
  562.      FreeRemember(&Remember,TRUE);
  563.      ErrorL(6,"Not enough memory!");
  564.      return;
  565.     }
  566.    n[i]->Node.ln_Name=&n[i]->String;
  567.    if(i==4) AddHead(&Liste,n[i]); else AddTail(&Liste,n[i]);
  568.   }
  569.  for(i=0;i<78;i++)
  570.    n[0]->String[i]='-';
  571.  n[0]->String[79]=0x00;
  572.  n[1]->String[0]=0x00;
  573.  sprintf(&n[2]->String,GetLStr(500,"Total playing time:     %2d:%02d'%02d"),
  574.          j/75/60,(j/75) % 60,j % 75);
  575.  sprintf(&n[3]->String,GetLStr(501,"ID-Number:               $%08lx"),cat->DiscID);
  576.  sprintf(&n[4]->String,"%s:",cat->CDName);
  577.  scr=LockPubScreen(NULL);
  578.  if(scr!=NULL)
  579.   {
  580.    vi=GetVisualInfoA(scr,NULL);
  581.    if(vi!=NULL)
  582.     {
  583.      if(lowres==FALSE) attr=&Times15; else attr=&Topaz9;
  584.      Font=OpenDiskFont(attr);
  585.      n1.ng_VisualInfo=vi;
  586.      n1.ng_TextAttr=attr;
  587.      n2.ng_VisualInfo=vi;
  588.      n2.ng_TextAttr=attr;
  589.      n2.ng_GadgetText=GetLStr(57,"_Okay");
  590.      gad=CreateContext(&GadgetList);
  591.      if(gad!=NULL)
  592.       {
  593.        Remember=NULL;
  594.        tag[0].ti_Tag=GTLV_ReadOnly;
  595.        tag[0].ti_Data=TRUE;
  596.        tag[1].ti_Tag=GTLV_Labels;
  597.        tag[1].ti_Data=&Liste;
  598.        tag[2].ti_Tag=TAG_DONE;
  599.        g1=CreateGadgetA(LISTVIEW_KIND,gad,&n1,&tag);
  600.        if(g1!=NULL)
  601.         {
  602.          tag[0].ti_Tag=GT_Underscore;
  603.          tag[0].ti_Data='_';
  604.          tag[1].ti_Tag=TAG_DONE;
  605.          g2=CreateGadgetA(BUTTON_KIND,g1,&n2,&tag);
  606.         }
  607.       }
  608.      if(g2!=NULL)
  609.       {
  610.        tag[0].ti_Tag=WA_Left;
  611.        tag[0].ti_Data=20;
  612.        tag[1].ti_Tag=WA_Top;
  613.        tag[1].ti_Data=15;
  614.        tag[2].ti_Tag=WA_InnerWidth;
  615.        tag[2].ti_Data=600;
  616.        tag[3].ti_Tag=WA_InnerHeight;
  617.        tag[3].ti_Data=203;
  618.        tag[4].ti_Tag=WA_IDCMP;
  619.        tag[4].ti_Data=CLOSEWINDOW|LISTVIEWIDCMP|IDCMP_GADGETUP|VANILLAKEY;
  620.        tag[5].ti_Tag=WA_Flags;
  621.        tag[5].ti_Data=ACTIVATE|WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|WFLG_GIMMEZEROZERO;
  622.        tag[6].ti_Tag=WA_Gadgets;
  623.        tag[6].ti_Data=GadgetList;
  624.        tag[7].ti_Tag=WA_Title;
  625.        tag[7].ti_Data=GetLStr(63,"Music Box - About CD");
  626.        tag[8].ti_Tag=WA_PubScreen;
  627.        tag[8].ti_Data=scr;
  628.        tag[9].ti_Tag=TAG_DONE;
  629.        win=OpenWindowTagList(NULL,&tag);
  630.        if(win!=NULL)
  631.         {
  632.          rp=win->RPort;
  633.          GTRefreshWindow(win,NULL);
  634.          ende=FALSE;
  635.          while(ende==FALSE)
  636.           {
  637.            WaitPort(win->UserPort);
  638.            msg=GTGetIMsg(win->UserPort);
  639.            while(msg!=NULL)
  640.             {
  641.              switch(msg->Class)
  642.               {
  643.                case CLOSEWINDOW:
  644.                  ende=TRUE;
  645.                 break;
  646.                case GADGETUP:
  647.                  gad=msg->IAddress;
  648.                  if(gad->GadgetID==10) ende=TRUE;
  649.                 break;
  650.                case VANILLAKEY:
  651.                  switch(toupper((UBYTE)msg->Code))
  652.                   {
  653.                    case 'O':
  654.                    case 'S':
  655.                      ende=TRUE;
  656.                     break;
  657.                   }
  658.                 break;
  659.               }
  660.              GTReplyIMsg(msg);
  661.              msg=GTGetIMsg(win->UserPort);
  662.             }
  663.           }
  664.          CloseWindow(win);
  665.         }
  666.        else
  667.          ErrorL(33,"Unable to open window!");
  668.        FreeGadgets(GadgetList);
  669.       }
  670.      else
  671.        ErrorL(31,"Unable to create gadgets!");
  672.      FreeVisualInfo(vi);
  673.      if(Font) CloseFont(Font);
  674.     }
  675.    else
  676.      ErrorL(30,"Unable to get VisualInfo!");
  677.    UnlockPubScreen(NULL,scr);
  678.   }
  679.  else
  680.    ErrorL(26,"Unable to lock public screen!");
  681. }
  682.  
  683. struct Segment
  684. {
  685.  ULONG Length;
  686.  BPTR  Next;
  687.  UWORD OpCode;
  688.  VOID (* Address)();
  689. };
  690.  
  691. struct Task *CreateProcess(function,stack,name,pri)
  692.  VOID   (* function)();
  693.  ULONG  stack;
  694.  UBYTE *name;
  695.  BYTE   pri;
  696. {
  697.  register struct Process *proc;
  698.  register struct Segment *Segment;
  699.  
  700.  Segment=AllocMem(sizeof(struct Segment),MEMF_CLEAR|MEMF_PUBLIC);
  701.  if(Segment==NULL) return(NULL);
  702.  Segment->Length=sizeof(struct Segment);
  703.  Segment->Next=NULL;
  704.  Segment->OpCode=0x4EF9;
  705.  Segment->Address=function;
  706.  Segment=(LONG)(&(Segment->Next)) >> 2;
  707.  
  708.  proc=CreateProc(name,pri,Segment,stack);
  709.  if(proc==NULL) return(NULL);
  710.  
  711.  return((struct Task *)((ULONG)proc-(ULONG)sizeof(struct Task)));
  712. }
  713.  
  714. void MacFormat(rp,tex,x)
  715.  struct RastPort *rp;
  716.  UBYTE           *tex;
  717.  int              x;
  718. {
  719.  REGISTER UWORD i,j,k,l;
  720.  
  721.  k=strlen(tex);
  722.  l=TextLength(rp,tex,k);
  723.  if(l>x)
  724.   {
  725.    i=0;
  726.    j=TextLength(rp,"...",3);
  727.    l=j;
  728.    do
  729.     {
  730.      j+=TextLength(rp,&tex[i],1L);
  731.      i++;
  732.     } while(j<x);
  733.    tex[i]=0x00;
  734.    for(j=i-1;j>0;j--)
  735.     {
  736.      if(tex[j]==' ') tex[j]=0x00; else break;
  737.     }
  738.    if(tex[0]!=0x00) strcat(tex,"...");
  739.   }
  740. }
  741.  
  742. void PutText(win,x,y,text)
  743.  struct Window   *win;
  744.  int              x,y;
  745.  UBYTE           *text;
  746. {
  747.  Move(win->RPort,x+OffsetX(win),y+OffsetY(win));
  748.  Text(win->RPort,text,strlen(text));
  749. }
  750.  
  751. void PutMText(win,x,y,text,l)
  752.  struct Window   *win;
  753.  int              x,y;
  754.  UBYTE           *text;
  755.  int              l;
  756. {
  757.  UBYTE buffer[262];
  758.  
  759.  strcpy(&buffer,text);
  760.  MacFormat(win->RPort,&buffer,l);
  761.  Move(win->RPort,x+OffsetX(win),y+OffsetY(win));
  762.  Text(win->RPort,&buffer,strlen(&buffer));
  763. }
  764.  
  765. int OffsetX(win)
  766.  struct Window *win;
  767. {
  768.  return( win->BorderLeft+4);
  769. }
  770.  
  771. int OffsetY(win)
  772.  struct Window *win;
  773. {
  774.  return(win->BorderTop+17);
  775. }
  776.  
  777. void InitSleepPointer()
  778. {
  779.  ChipData=AllocMem(SleepPointerSize,MEMF_CHIP|MEMF_PUBLIC);
  780.  if(ChipData!=NULL)
  781.    CopyMemQuick(&SleepPointerData,ChipData,SleepPointerSize);
  782. }
  783.  
  784. void RemoveSleepPointer()
  785. {
  786.  if(ChipData) FreeMem(ChipData,SleepPointerSize);
  787. }
  788.  
  789. void SleepPointer(win)
  790.  struct Window *win;
  791. {
  792.  if(ChipData) SetPointer(win,ChipData,22,16,-7,-7);
  793. }
  794.  
  795. void DeleteMMPort(port)
  796.  struct MsgPort *port;
  797. {
  798.  register struct MusicBoxCommand *mbc;
  799.  
  800.  Forbid();
  801.  mbc=GetMsg(port);
  802.  while(mbc!=NULL)
  803.   {
  804.    mbc->Status=MBCS_NO_PORT;
  805.    ReplyMsg(mbc);
  806.    mbc=GetMsg(port);
  807.   }
  808.  DeletePort(port);
  809.  Permit();
  810. }
  811.  
  812. void SetupPrinter()
  813. {
  814.  struct TagItem              tag[5];
  815.  register struct FileHandle *con;
  816.  
  817.  con=Open("CON:10/20/620/150/Music Box/AUTO/WAIT/CLOSE",MODE_NEWFILE);
  818.  if(con!=NULL)
  819.   {
  820.    tag[0].ti_Tag=SYS_Input;
  821.    tag[0].ti_Data=NULL;
  822.    tag[1].ti_Tag=SYS_Output;
  823.    tag[1].ti_Data=con;
  824.    tag[2].ti_Tag=SYS_Asynch;
  825.    tag[2].ti_Data=TRUE;
  826.    tag[3].ti_Tag=SYS_UserShell;
  827.    tag[3].ti_Data=TRUE;
  828.    tag[4].ti_Tag=TAG_DONE;
  829.    SystemTagList("SYS:Prefs/Printer",&tag);
  830.   }
  831.  else
  832.    ErrorL(20,"Unable to open AutoCon-window!");
  833. }
  834.  
  835. void PrintIt(win,cat)
  836.  struct Window  *win;
  837.  struct Katalog *cat;
  838. {
  839.  UBYTE                       text[100];
  840.  register long               i,m,s,f;
  841.  register struct FileHandle *fh;
  842.  
  843.  if(cat!=NULL)
  844.   {
  845.    i=MultiRequestA(GetLStr(502,"Print..."),
  846.                    GetLStr(503,"Do you want to print the current catalog?"),
  847.                    GetLStr(504,"Draft|Letter Quality|Abort"));
  848.    SleepPointer(win);
  849.    if(i!=0)
  850.     {
  851.      fh=Open("PRT:",MODE_NEWFILE);
  852.      if(fh!=NULL)
  853.       {
  854.        if(i==1)
  855.          strcpy(&text,"\x1b0\x1b#1\x1b[1\"z\x1bE\x1b[4m\x1b[1m");
  856.        else
  857.          strcpy(&text,"\x1b0\x1b#1\x1b[2\"z\x1bE\x1b[4m\x1b[1m");
  858.        Write(fh,&text,strlen(&text));
  859.        Write(fh,&cat->CDName,strlen(&cat->CDName));
  860.        sprintf(&text,"\n\n\x1b[24m\x1b[22m");
  861.        Write(fh,&text,strlen(&text));
  862.  
  863.        for(i=0;i<cat->Anzahl;i++)
  864.         {
  865.          m=cat->KE[i].TAdresse/75/60;
  866.          s=(cat->KE[i].TAdresse/75) % 60;
  867.          f=cat->KE[i].TAdresse % 75;
  868.          sprintf(&text,"\x1b[1m%02d\x1b[22m  %2ld:%02ld'%02ld  %s\n",i+1,m,s,f,&cat->KE[i].Titel);
  869.          Write(fh,&text,strlen(&text));
  870.         }
  871.  
  872.        Close(fh);
  873.       }
  874.      else
  875.        ErrorL(505,"Unable to open PRT:");
  876.     }
  877.    ClearPointer(win);
  878.   }
  879.  else
  880.   {
  881.    MultiRequestA(GetLStr(502,"Print..."),
  882.                  GetLStr(506,"Please select a CD before print!"),
  883.                  GetLStr(507,"Okay"));
  884.   }
  885. }
  886.  
  887. void CleanUpPort(port)
  888.  struct MsgPort *port;
  889. {
  890.  register struct Message *msg;
  891.  
  892.  msg=GetMsg(port);
  893.  while(msg!=NULL)
  894.   {
  895.    ReplyMsg(msg);
  896.    msg=GetMsg(port);
  897.   }
  898. }
  899.  
  900. UWORD LibVersionCheck(required)
  901.  UWORD required;
  902. {
  903.  UBYTE str[150];
  904.  
  905.  if(required>MBL_VERSION)
  906.   {
  907.    sprintf(&str,
  908.            GetLStr(85,"Wrong version of musicbox.library!\nThis program requires version %d.%02d,\ninstalled version is %d.%02d."),
  909.            required/100,required % 100,
  910.            MBL_VERSION/100,MBL_VERSION % 100);
  911.    MultiRequestA(GetLStr(84,"Music Box-Library - Error!"),
  912.                  &str,
  913.                  GetLStr(16,"Abort"));
  914.    return(0);
  915.   }
  916.  return(MBL_VERSION);
  917. }
  918.  
  919.